//#include <iostream>
//#include "string.h"
//#include "algorithm.h"
//#include "console.h"
//
//#include "string_utils.h"
//
//#include <ctime>
//
//bool running = true;
//int text_colour = 15;
//
//void function(cpac::vector< cpac::string >::type const& in_args)
//{
//}
//
//#include <fstream>
//#include <iterator>
//#include <Windows.h>
//#include <regex>
//namespace console_functions
//{
//    namespace file_parsing
//    {
//        cpac::vector< cpac::string >::type parse_file(cpac::string in_name)
//        {
//            cpac::vector< cpac::string >::type contents;
//            std::ifstream file(in_name.c_str());
//            if(!file.is_open())
//            {
//                cpac::g_console.print("Could not open file ");
//                cpac::g_console.print(in_name);
//                return contents;
//            }
//
//            cpac::string line;
//            while(file.good())
//            {
//                std::getline(file, line);
//                contents.push_back(line);
//            }
//
//            return contents;
//        }
//
//        void highlight_text(cpac::vector< cpac::string >::type& in_strings, cpac::string const& in_type)
//        {
//           /* std::for_each(std::begin(in_strings), std::end(in_strings), [](cpac::string& in_line)
//            {
//                cpac::vector< cpac::string >::type tokenised_line;
//                cpac::string_tokeniser< cpac::is_space >::tokenise(in_line, tokenised_line);
//
//                cpac::g_console.print(in_line);
//            });*/
//        }
//
//        void view_file_contents(cpac::vector< cpac::string >::type const& in_args)
//        {
//            if(in_args.size() != 2)
//            {
//                cpac::g_console.print("view: usage is view file-name");
//                return;
//            }
//
//            auto file (parse_file(in_args[1]));
//
//            // Do some magic syntax highlighting
//            highlight_text(file, "cpp");
//        }
//
//        void set_text_colour(cpac::vector< cpac::string >::type const& in_args)
//        {
//            if(in_args.size() != 2)
//            {
//                cpac::g_console.print("set_text_colour: usage is set_text_colour number");
//                return;
//            }
//            ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), cpac::from_string< int >(in_args[1]));
//        }
//
//        namespace easter_egg
//        {
//            void hooch_game(cpac::vector< cpac::string >::type const& in_args);
//        }
//    }
//}
//
//int var = 10;
//
//int main(int argc, char* argv[])
//{
//	char proceed;
//
//    cpac::g_console.print("Console active");
//    cpac::g_console.render();
//    cpac::g_console.add_variable("var", var, cpac::TYPE_INT);
//    cpac::g_console.add_variable("running", running, cpac::TYPE_BOOL);
//
//    cpac::g_console.add_function("/view", console_functions::file_parsing::view_file_contents);
//    cpac::g_console.add_function("/set_text_colour", console_functions::file_parsing::set_text_colour);
//    cpac::g_console.add_function("/start_hooch", console_functions::file_parsing::easter_egg::hooch_game);
//
//    cpac::string command;
//    while(running)
//    {
//        std::getline(std::cin, command);
//        cpac::g_console.parse_command_line(command);
//        command.clear();
//        cpac::g_console.render();
//    }
//
//	std::cout << "\nPress Return to terminate app...\n";
//	std::cin.get();
//	return 0;
//}
//
//void console_functions::file_parsing::easter_egg::hooch_game(cpac::vector< cpac::string >::type const& in_args)
//{
//    /*
//       
//    */
//}

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>


namespace cpac
{

    template< typename _Iterator, typename _Value >
    bool equal(_Iterator in_range_begin, _Iterator in_range_end, _Value in_equals)
    {
        for( ; in_range_begin != in_range_end; ++in_range_begin)
        {
            if(!(*in_range_begin == in_equals))
            {
                return false;
            }
        }
        return true;
    }

    template< typename _Iterator >
    bool values_identical_in_range(_Iterator in_range_begin, _Iterator in_range_end)
    {
        for(_Iterator compare_to = in_range_begin+1; compare_to != in_range_end; ++compare_to, ++in_range_begin)
        {
            if(!(*in_range_begin == *compare_to))
            {
                return false;
            }
        }
        return true;
    }

}

struct test
{
    test(int in) : data(in) {}
    int data;
};

int main(int argc, char* argv[])
{
    std::vector<std::unique_ptr<test>> vec;
    vec.push_back(std::unique_ptr<test>(new test(256)));
    auto iterator = std::begin(vec);
    std::cout << (*iterator)->data << "\n";
    std::cout << "Test complete!" << "\n";
    std::cin.get();
    return 0;
}
